iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 16
0

前言

延續前兩天的問題,因為我有一個 Table View 顯示了各種飲料清單,而使用者可以選擇飲料後,傳入購物車的 Table View,這之間需要利用『陣列』傳值,所以我稍微再研究了一下陣列及字典的使用方法,也把自己思考邏輯整理一下。

第一次嘗試

假設我們有四種飲料要賣
先把這四種飲料放進一個[String]的陣列

var teaName = ["茉莉綠茶", "阿薩姆紅茶", "四季春茶", "黃金烏龍"]

另外假設這四個飲料都還沒有人訂,所以訂購數量都是0,也把它傳入另外一個數字陣列

var teaCount = [0, 0, 0, 0]

如果今天有人購買一杯"四季春茶",我們就變更 teaCount[2] = 1

var teaCount = [0, 0, 1, 0]

因為購物車不需要顯示沒有訂購的項目,所以利用forEach來判別陣列裡每個值

var teaCountInCart: [Int] = []

teaCount.forEach { count in
    if count > 0 {
        teaCountInCart.append(count)
    }
}

// teaCountInCart變成[1]

PS: .forEach後面用的是一個尾隨閉包的概念,忘記的人去翻翻前面的語法喔!!

好棒棒!!陣列只保留我們要的了!!?
看起來好像對?但是我們不知道飲料名稱啊??

如果使用index(of: )的方法可以用值反查索引值,但是萬一有重複的值,他也只會在找到第一筆匹配的索引值就回傳了,Ex

var teaCount = [0, 0, 1, 1]
teaCount.index(of: 1) //回傳值2

總不可能叫客戶不同產品只能買不同杯吧!!?

第二次嘗試

既然名稱和數量分開的陣列無法對應,那我們直接把兩個關聯起來不就好了!?

沒錯!!就是 swift 裡面的字典!!
一樣,假設我們有四種飲料要買,初始購買量分別為0杯

var teaList = ["茉莉綠茶": 0, "阿薩姆紅茶": 0, "四季春茶": , "黃金烏龍": 0]

假設今天有人買了兩杯綠茶,一杯紅茶,兩杯青茶

teaList["茉莉綠茶"] = 2
teaList["阿薩姆紅茶"] = 1
teaList["四季春茶"] = 2

字典一樣有forEach的方法,只是回傳的值有 key 和 value ,因為 tableview 是表格行數來決定顯示資料的,所以我這邊也故意將字典轉換成兩個陣列,方便後面 tableview 要調用資料

var teaNameInCart: [String] = []
var teaCountInCart: [Int] = []

teaList.forEach { teaList in
    if teaList.value != 0 {
        teaNameInCart.append(d.key)
        teaCountInCart.append(d.value)
    }
}
// teaNameInCart is ["茉莉綠茶", "阿薩姆紅茶", "四季春茶"]
// teaCountInCart is [2, 1, 2]

完成!!

延伸討論

字典裡面的 value 資料型態不限定是單一資料,也可以是陣列、甚至是字典,我們來看看會變成怎樣

var teaNameInCart: [String] = []
var teaCountInCart: [[String: Int]] = [] //資料型態也要改成裡面是字典的陣列

var teaList = ["茉莉綠茶": ["無糖": 0, "少糖": 0], "阿薩姆紅茶": ["無糖": 0, "少糖": 0], "四季春茶": ["無糖": 0, "少糖": 0], "黃金烏龍": ["無糖": 0, "少糖": 0]]

// 客人買了一杯無糖綠茶
teaList["茉莉綠茶"] = ["無糖": 1, "少糖": 0]

teaList.forEach { d in
    if d.value != ["無糖": 0, "少糖": 0] {
        teaNameInCart.append(d.key)
        teaCountInCart.append(d.value)
    }
}
teaNameInCart // ["茉莉綠茶"]
teaCountInCart // [["無糖": 1, "少糖": 0]]

兩個問題要注意

  1. teaCountInCart 資料型態也要改成裡面是字典的"陣列",把字典包在陣列的原因是我們需要指定的索引值!!字典本身是沒有排列順序的,如果沒有索引值,我們就不能把飲料名稱和飲料數量做關聯了

  2. teaCountInCart 回傳的資料還是字典,裡面還有一個少糖": 0 的資料是我們不要的,必要的話還要再繼續判斷

我自己的解法如下:(順便讓客戶追加烏龍無糖、烏龍少糖各一杯)

var teaNameInCart: [String] = []
var teaCountInCart: [[String: Int]] = []
var sugarSelected: [String: Int] = [:]

var teaList = ["茉莉綠茶": ["無糖": 0, "少糖": 0], "阿薩姆紅茶": ["無糖": 0, "少糖": 0], "四季春茶": ["無糖": 0, "少糖": 0], "黃金烏龍": ["無糖": 0, "少糖": 0]]

teaList["茉莉綠茶"] = ["無糖": 1, "少糖": 0]
teaList["黃金烏龍"] = ["無糖": 1, "少糖": 1]

teaList.forEach { teaList in
    if teaList.value != ["無糖": 0, "少糖": 0] {
        teaNameInCart.append(teaList.key)
        sugarSelected = teaList.value
        sugarSelected.forEach { sugarSelected in
            if sugarSelected.value != 0 {
                teaCountInCart.append([sugarSelected.key : sugarSelected.value])
            }
        }
    }
}
teaNameInCart // ["黃金烏龍", "茉莉綠茶"]
teaCountInCart [["無糖": 1], ["少糖": 1], ["無糖": 1]]

teaNameInCart索引值0 是"黃金烏龍"
teaCountInCart索引值0 是["無糖": 1], ["少糖": 1]

teaNameIncart索引值1 是"茉莉綠茶"
teaCountInCart索引值1 是["無糖": 1]

後面要讀取資料就很方便了~


上一篇
Day15 - 臨時儲存 (UserDefaults)
下一篇
Day 17 - 展示控制器 (Split View Controller)
系列文
無中生有-從SWIFT語法學習到iOS APP的開發30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言